/**
 * 54. 螺旋矩阵
 * 
 * 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
 * 
 * 示例 1：如图T54-1
 * 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
 * 输出：[1,2,3,6,9,8,7,4,5]
 * 
 * 示例 2：如图T54-2
 * 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
 * 输出：[1,2,3,4,8,12,11,10,9,5,6,7]
 * 
 * 提示：
 * m == matrix.length
 * n == matrix[i].length
 * 1 <= m, n <= 10
 * -100 <= matrix[i][j] <= 100
 * 
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/spiral-matrix
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 
 */
package zw;

import java.util.ArrayList;
import java.util.List;

public class T54 {
	public List<Integer> spiralOrder(int[][] matrix) {
		int m = matrix.length;
		int n = matrix[0].length;
		int minM = 0;
		int maxM = m;
		int minN = 0;
		int maxN = n;
		int direction = 0;
		List<Integer> ans = new ArrayList<Integer>();
		int count = 0;
		
		while(minM != maxM && minN != maxN) {
			switch (direction) {
			case 0:
				for(int i = minN; i < maxN; i++) {
					count++;
					ans.add(matrix[minM][i]);
				}
				minM += 1;
				direction += 1;
				break;
			case 1:
				for(int i = minM; i < maxM; i++) {
					count++;
					ans.add(matrix[i][maxN-1]);
				}
				maxN -= 1;
				direction = 2;
				break;
			case 2:
				for(int i = maxN - 1; i >= minN; i--) {
					count++;
					ans.add(matrix[maxM-1][i]);
				}
				maxM -= 1;
				direction = 3;
				break;
			case 3:
				for(int i = maxM - 1; i >= minM; i--) {
					count++;
					ans.add(matrix[i][minN]);
				}
				minN += 1;
				direction = 0;
				break;
			}
		}
		
		// 第二中结束判断条件
//		while(count < m*n) {
//			switch (direction) {
//			case 0:
//				for(int i = minN; i < maxN; i++) {
//					count++;
//					ans.add(matrix[minM][i]);
//				}
//				minM += 1;
//				direction += 1;
//				break;
//			case 1:
//				for(int i = minM; i < maxM; i++) {
//					count++;
//					ans.add(matrix[i][maxN-1]);
//				}
//				maxN -= 1;
//				direction = 2;
//				break;
//			case 2:
//				for(int i = maxN - 1; i >= minN; i--) {
//					count++;
//					ans.add(matrix[maxM-1][i]);
//				}
//				maxM -= 1;
//				direction = 3;
//				break;
//			case 3:
//				for(int i = maxM - 1; i >= minM; i--) {
//					count++;
//					ans.add(matrix[i][minN]);
//				}
//				minN += 1;
//				direction = 0;
//				break;
//			}
//		}
		return ans;
    }
	
	public static void main(String[] args) {
		T54 t54 = new T54();
		System.out.println(t54.spiralOrder(new int[][]{{1},{2},{3}}));
		System.out.println(t54.spiralOrder(new int[][]{{1,2},{3,4}}));
		System.out.println(t54.spiralOrder(new int[][]{{1,2,3},{4,5,6},{7,8,9}}));
		System.out.println(t54.spiralOrder(new int[][] {{1,2,3,4},{5,6,7,8},{9,10,11,12}}));
	}
}
